#ifndef _TPORO_H_
#define _TPORO_H_

#include <iostream>

using namespace std;


class TPoro
{
	friend ostream & operator<<(ostream & os, const TPoro & p);
	public:
		/** \brief Constructor por defecto.
		 *  Crea un vector de poros vacio.
		 */
   		TPoro();
   		/** \brief Constructor de nuestra clase TPoro en base a una coordenada y a un volumen.
		 *  Nos crea un con el volumen deseado en el lugar que elijamos.  			 
		 *  \param px Valor de x.
		 *  \param py Valor de y.	
		 *  \param pvolumen Volumen del poro.
		 */
   		TPoro(int px, int py, double pvolumen);
   		/** \brief Constructor de nuestra clase TPoro en base a una coordenada, un volumen y un color determinados.
		 *  Nos crea un con el volumen deseado en el lugar que elijamos.  			 
		 *  \param px Valor de x.
		 *  \param py Valor de y.	
		 *  \param pvolumen Volumen del poro.
		 *  \param pcolor Color del poro.
		 */
		TPoro(int px, int py, double pvolumen, char* pcolor);
		/** \brief Constructor de copia de nuestra clase.
		 *  Nos crea un poro copia del pasado como parametro. 			 
		 *  \param p El parametro será el poro en base al cual queramos generar el nuevo poro.
		 */
		TPoro(const TPoro& p);
		/** \brief Destructor nuestra clase.
		 *  Libera la memoria y destruye el tporo. 			 
		 */
		~TPoro();
		/** \brief Operador de asignación.
		 *  Iguala un tporo a otro. 			 
		 *  \param p El parametro será el poro en base al cual queramos igualar. 
		 *  \return Nos devuelve el puntero this que en este caso es el poro que en principio a llamado al metodo pero modificado 			    para ser igual al parametro.
		 */
		TPoro& operator=(const TPoro& p);
		/** \brief Operador de igualdad entre dos tporos.
		 *  Este método compara dos poros los cuales deben ser exactamente iguales para que dicha comparacion sea cierta. 		
		 *  \param p TPoro a comparar.
		 *  \return Este metodo nos devolverá un tipo bool que nos dirá si es cierta o falsa la comparación.
		 */
		bool operator==(const TPoro& p) const;
		/** \brief Operador de desigualdad entre dos tporos.
		 *  Este método compara dos poros los cuales deben ser distintos para que dicha comparacion sea cierta. 		
		 *  \param p TPoro a comparar.
		 *  \return Este metodo nos devolverá un tipo bool que nos dirá si es cierta o falsa la comparación.
		 */
		bool operator!=(const TPoro& p) const;
		/** \brief Modificador de posicion.
		 *  Modifica los atributos x e y en funcion de los pasados como parametros. 			 
		 *  \param px Nuevo valor del atributo x.
		 *  \param py Nuevo valor del atributo y.
		 */
		void Posicion(int px, int py);
		/** \brief Modificador de volumen.
		 *  Modifica el atributo volumen. 			 
		 *  \param pvolumen Nuevo valor del atributo volumen.
		 */
		void Volumen(double pvolumen);
		/** \brief Modificador de color.
		 *  Modifica el atributo color. 			 
		 *  \param pcolor Nuevo valor del atributo color.
		 */
		void Color(char* pcolor);
		/** \brief Valor de X.
		 *  Este método constante nos devuelve el valor de X. 		
		 *  \return Devuelve un entero con el valor de X.
		 */
		int PosicionX() const;
		/** \brief Valor de Y.
		 *  Este método constante nos devuelve el valor de Y. 		
		 *  \return Devuelve un entero con el valor de Y.
		 */
		int PosicionY() const;
		/** \brief Valor del Volumen.
		 *  Este método constante nos devuelve el volumen del poro. 		
		 *  \return Devuelve un double con el volumen del poro.
		 */
		double Volumen() const;
		/** \brief Color del TPoro.
		 *  Este método constante nos devuelve el color del poro. 		
		 *  \return Devuelve un char* con el color del poro.
		 */
		char* Color() const;
		/** \brief EsVacio.
		 *  Este método constante comprueba si el TPoro es vacio. 		
		 *  \return Devuelve un bool indicando si el TPoro es vacio.
		 */
		bool EsVacio() const;
		
		bool VolMayor(const TPoro p) const;

	protected:

	private:
		/** \brief Entero X.
		 * Declaracion del entero que contiene el valor de x de la coordenada. 
		 */
		int x;
		/** \brief Entero Y.
		 * Declaracion del entero que contiene el valor de y de la coordenada.
		 */
		int y;
		/** \brief Volumen.
		 * Declaracion del double que contiene el valor del volumen. 
		 */
		double volumen;
		/** \brief Color.
		 * Declaracion del char* que contiene el color del TPoro. 
		 */
		char* color;

};

#endif // _TPORO_H_
